#!/usr/bin/env python3
"""
第1.5阶段智能爬取启动脚本
使用新的账号池管理、网络调度和监控面板功能
"""

import sys
import logging
import time
import argparse
from pathlib import Path

# 添加项目路径
sys.path.append(str(Path(__file__).parent))

from core.crawler_core import CrawlerCore
from utils.logger import setup_logger

# 设置日志
logger = setup_logger('intelligent_crawl', 'logs/intelligent_crawl.log')

def print_banner():
    """打印启动横幅"""
    banner = """
    ╔══════════════════════════════════════════════════════════════╗
    ║                第1.5阶段智能爬虫系统                        ║
    ║                                                              ║
    ║  🚀 特性：                                                   ║
    ║    • 智能账号池管理 (公司/家庭网络隔离)                     ║
    ║    • 网络环境自动检测和调度                                 ║
    ║    • 实时监控面板和进度跟踪                                 ║
    ║    • 基于第一阶段反爬虫增强功能                             ║
    ║                                                              ║
    ║  📊 目标：1周内爬取10000条数据                              ║
    ╚══════════════════════════════════════════════════════════════╝
    """
    print(banner)

def check_system_status(crawler):
    """检查系统状态"""
    logger.info("🔍 检查系统状态...")
    
    # 检查第1.5阶段组件
    phase_status = crawler.get_phase_1_5_status()
    
    if not phase_status['enabled']:
        logger.error("❌ 第1.5阶段组件未启用")
        logger.error(f"原因: {phase_status.get('reason', 'Unknown')}")
        return False
    
    logger.info("✅ 第1.5阶段组件已启用")
    
    # 检查账号池状态
    account_status = phase_status['account_manager']['pool_status']
    company_available = account_status['company_pool']['available']
    home_available = account_status['home_pool']['available']
    
    logger.info(f"📊 账号池状态:")
    logger.info(f"  公司网络: {company_available}/{account_status['company_pool']['total']} 可用")
    logger.info(f"  家庭网络: {home_available}/{account_status['home_pool']['total']} 可用")
    
    if company_available == 0 and home_available == 0:
        logger.error("❌ 无可用账号，无法开始爬取")
        return False
    
    # 检查调度器状态
    scheduler_status = phase_status['scheduler']['status']
    current_network = scheduler_status['current_network']
    should_crawl = scheduler_status['should_crawl']
    
    logger.info(f"🌐 网络环境: {current_network}")
    logger.info(f"⏰ 当前时段: {scheduler_status['current_time_slot']}")
    logger.info(f"🚀 适合爬取: {'是' if should_crawl else '否'}")
    
    if not should_crawl:
        next_optimal = scheduler_status.get('next_optimal_time')
        if next_optimal:
            logger.warning(f"⚠️ 当前时段不是最优爬取时间，建议 {next_optimal} 开始")
        else:
            logger.warning("⚠️ 当前时段不适合爬取")
    
    return True

def interactive_mode(crawler):
    """交互模式"""
    print("\n🎮 进入交互模式")
    print("可用命令:")
    print("  1. status  - 显示系统状态")
    print("  2. crawl   - 开始智能爬取")
    print("  3. monitor - 显示监控面板")
    print("  4. quit    - 退出程序")
    
    while True:
        try:
            command = input("\n请输入命令 (status/crawl/monitor/quit): ").strip().lower()
            
            if command == 'quit' or command == 'q':
                print("👋 再见！")
                break
            
            elif command == 'status' or command == 's':
                check_system_status(crawler)
                
            elif command == 'monitor' or command == 'm':
                crawler.monitor.print_dashboard()
                
            elif command == 'crawl' or command == 'c':
                # 获取爬取参数
                cities = input("请输入城市列表 (用逗号分隔，默认: 苏州,杭州): ").strip()
                if not cities:
                    cities = "苏州,杭州"
                cities = [city.strip() for city in cities.split(',')]
                
                categories = input("请输入品类列表 (用逗号分隔，默认: 火锅,川菜): ").strip()
                if not categories:
                    categories = "火锅,川菜"
                categories = [cat.strip() for cat in categories.split(',')]
                
                print(f"\n🎯 开始爬取: {cities} × {categories}")
                
                # 开始智能爬取
                success = crawler.start_intelligent_crawl_session(cities, categories)
                
                if success:
                    print("✅ 爬取会话成功完成")
                else:
                    print("❌ 爬取会话失败")
                    
            else:
                print("❌ 未知命令，请重新输入")
                
        except KeyboardInterrupt:
            print("\n👋 用户中断，退出程序")
            break
        except Exception as e:
            logger.error(f"❌ 命令执行异常: {e}")

def auto_mode(crawler, cities, categories, max_sessions=5):
    """自动模式"""
    logger.info(f"🤖 进入自动模式，最大会话数: {max_sessions}")
    logger.info(f"🎯 目标: {cities} × {categories}")
    
    session_count = 0
    total_success = 0
    
    while session_count < max_sessions:
        session_count += 1
        logger.info(f"\n🚀 开始第 {session_count} 个会话")
        
        # 检查是否适合爬取
        if not crawler.scheduler.should_start_crawling():
            logger.warning("⚠️ 当前时段不适合爬取，等待30分钟后重试")
            time.sleep(1800)  # 等待30分钟
            continue
        
        # 开始智能爬取
        success = crawler.start_intelligent_crawl_session(cities, categories)
        
        if success:
            total_success += 1
            logger.info(f"✅ 第 {session_count} 个会话成功")
        else:
            logger.warning(f"❌ 第 {session_count} 个会话失败")
        
        # 会话间延迟
        if session_count < max_sessions:
            delay_time = 3600  # 1小时间隔
            logger.info(f"⏰ 等待 {delay_time/60:.0f} 分钟后开始下一个会话")
            time.sleep(delay_time)
    
    # 输出总结
    logger.info(f"\n📊 自动模式完成:")
    logger.info(f"  总会话数: {session_count}")
    logger.info(f"  成功会话: {total_success}")
    logger.info(f"  成功率: {total_success/session_count:.1%}")

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='第1.5阶段智能爬虫系统')
    parser.add_argument('--mode', choices=['interactive', 'auto'], default='interactive',
                       help='运行模式: interactive(交互) 或 auto(自动)')
    parser.add_argument('--cities', default='苏州,杭州',
                       help='城市列表，用逗号分隔')
    parser.add_argument('--categories', default='火锅,川菜',
                       help='品类列表，用逗号分隔')
    parser.add_argument('--max-sessions', type=int, default=5,
                       help='自动模式最大会话数')
    
    args = parser.parse_args()
    
    # 打印启动横幅
    print_banner()
    
    # 解析参数
    cities = [city.strip() for city in args.cities.split(',')]
    categories = [cat.strip() for cat in args.categories.split(',')]
    
    logger.info("🚀 启动第1.5阶段智能爬虫系统")
    logger.info(f"运行模式: {args.mode}")
    logger.info(f"目标城市: {cities}")
    logger.info(f"目标品类: {categories}")
    
    try:
        # 初始化爬虫核心
        logger.info("🔧 初始化爬虫核心...")
        crawler = CrawlerCore()
        
        # 检查系统状态
        if not check_system_status(crawler):
            logger.error("❌ 系统状态检查失败，退出程序")
            return 1
        
        # 显示初始监控面板
        logger.info("\n📊 初始系统状态:")
        crawler.monitor.print_dashboard()
        
        # 根据模式运行
        if args.mode == 'interactive':
            interactive_mode(crawler)
        else:
            auto_mode(crawler, cities, categories, args.max_sessions)
        
        logger.info("🎉 程序正常结束")
        return 0
        
    except KeyboardInterrupt:
        logger.info("👋 用户中断程序")
        return 0
    except Exception as e:
        logger.error(f"❌ 程序异常: {e}")
        import traceback
        logger.error(traceback.format_exc())
        return 1

if __name__ == "__main__":
    sys.exit(main())
